package com.fhcodeintegration.demo07.util;
 
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
 
public class CodeX {
    /**
     * 1. 设置二维码的参数
     * 2. 生成二维码
     * 3. 将二维码导出
     */
 
    /**
     *
     * @param content 编码的内容
     * @param path 本地保存的路径
     * @return
     */
    public boolean createCode(String content,String path){
        // 1 设置基本参数
        int width = 300;
        int height = 300;
        String format = "png";//保存图片的格式，注意：不同平台可能有它的图片格式要求
        // 2 设置额外参数，一定要保存到map集合中
        Map map = new HashMap();
        // 2.1 设置容错率
        // 其中key键就是EncodeHintType.ERROR_CORRECTION
        // value值也是枚举类ErrorCorrectionLevel.M，可自行选择容错率等级l>M>Q>H
        // 当等级越高，扫描所需的时间越高，但是准确率越高。
        map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        // 2.2 生成条码的时候使用，指定边距，单位像素
        map.put(EncodeHintType.MARGIN,2);
        // 2.3 设置字符集
        map.put(EncodeHintType.CHARACTER_SET,"utf-8");
 
        // 3 生成二维码
        // MultiFormatWriter继承了Writer
        // 通过该对象的encode方法即可生成二维码BitMatrix
        // 该方法形参分别对应了：
        // 第一个参数为编码的内容，
        // 第二个参数选择生成编码为二维码
        // 第三第四分别对应编码的宽度和高度
        // 第五个参数为对应的额外参数
        // 然后需要try、catch抛出异常
        try {
            BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, map);
            // 4 导出到本地
            File file = new File(path);
            Path path1 = file.toPath();
            System.out.println(path1);
            MatrixToImageWriter.writeToPath(encode,format,path1);
            return true;
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }
 
        return false;
    }
 
    public static void main(String[] args) {
        boolean code = new CodeX().createCode("夏至小姐姐，留个微信呗", "H:\\ceshi\\2.png");
        if (code){
            System.out.println("成功");
        }else {
            System.out.println("失败了");
        }
    }
}